"""
1．修改和添加元素:当以指定“键”为下标给字典元素赋值时，有下面两种含义
    （1）若该“键”在字典中存在，则表示修改该“键”对应的值。
    （2）若该“键”不存在，则表示添加一个新的“键-值”对，即添加一个新元素到字典中
"""
# #创建字典
# stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}
# print(stu_info)
# stu_info['age'] = 11				#修改age的值
# print(stu_info['age'])				#输出修改后的age值，结果为11
# stu_info['sex'] = '女'				#添加学生性别
# #输出添加后的字典，结果为{'num': '20210101', 'name': '小蓝', 'age': 11, 'sex': '女'}
# print(stu_info)

"""
2．删除元素：要删除字典中的元素或整个字典，可以使用del命令、clear()方法、pop()方法或popitem()方法
（1）del命令：根据“键”删除字典中的元素
"""
# 创建字典
# stu_info={'num': '20210101', 'name': '小蓝','age': 10}
# del stu_info['age']					#删除age“键-值”对
# print(stu_info)  #输出删除后的字典，结果为{'num': '20210101', 'name': '小蓝'}
"""
（2）clear()方法：删除字典中的所有元素
语法：dict.clear()
    dict表示字典名。该方法不包含任何参数，也没有返回值
"""
# 创建字典
# stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}
# print(stu_info)
# stu_info.clear()		#清空字典
# print(stu_info)			#输出清空后的字典，结果为{}
"""
（3）pop()方法：删除指定的“键-值”对，并返回该“键”的值
语法：dict.pop(key[,default])
    dict表示字典名；key表示删除的键；default是默认值，当字典中没有要删除的key时，该方法返回指定的默认值
"""
# #创建字典
# stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}
# print(stu_info.pop('age'))			#删除age“键-值”对，并返回age的值10
# print(stu_info)
# print(stu_info.pop('age', 11))	#无指定键，返回默认值11
"""
（4）popitem()方法：随机删除并返回一个“键-值”对
语法：dict.popitem()
    dict表示字典名。该方法无参数，返回值为一个随机的“键-值”对
注意：
    Python 3.6及以前：字典是无序的，popitem() 确实是随机删除
    Python 3.7+：字典保持插入顺序，popitem() 删除并返回最后插入的键值对
"""
# 创建字典
# stu_info = {
#     'num': '20210101',
#     'name': '小蓝',
#     'age': 10,
#     "sex":'女'
# }
# print(stu_info.popitem())#随机删除并返回某“键-值”对，如('age', 10)
# #输出字典，结果为{'num': '20210101', 'name': '小蓝'}
# print(stu_info)


"""
3．更新字典：update()方法用于将新字典的“键-值”对一次性全部添加到当前字典中，如果两个字典中存在相同的“键”，则以新字典中的“值”更新当前字典
语法：dict.update(dict1)
    dict表示当前字典，dict1表示新字典
"""
# #创建字典stu_info
# stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}
# #修改age的值，同时添加新元素
# stu_info.update({'age': 11, 'sex': '女'})
# #输出字典，结果为{'num': '20210101', 'name': '小蓝', 'age': 11, 'sex': '女'}
# print(stu_info)
"""
【例4-14】    更新中英文字典
【参考代码】
"""
# dictionary = {
#     '卷心菜': 'cabbage',
#     '午餐': 'lunch',
#     '机器人': 'robot',
#     '天空': 'sky',
#     '花': 'flower'
# }											#创建字典dictionary并赋值
# # print(dictionary)						#输出dictionary
# dictionary.pop('卷心菜')				#删除“卷心菜”键-值对
# print(dictionary)						#输出dictionary
# #添加新字典
# dictionary.update({'公园': 'park', '桥': 'bridge'})
# print(dictionary)								#输出dictionary
# # dictionary['午餐'] = ['lunch', 'nooning']	#修改“午餐”的值
# # print(dictionary)								#输出dictionary
# # print(dictionary['午餐'][1])
#
# dictionary['午餐'] = { #修改“午餐”的值
#     'name': '小明',
#     "age":18,
#     "sex":'男'
# }
# print(dictionary)
# print(dictionary['午餐']['name'])

"""
4．复制字典:复制字典可使用copy()方法，返回字典的浅复制
语法： dict.copy()
    dict表示需要复制的字典，该方法无参数，返回一个新字典
"""
# #创建字典stu_info
# stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}
# print(stu_info)
# stu_info1 = stu_info.copy()		#复制stu_info，并赋给stu_info1
# #输出stu_info1，结果为{'num':'20210101','name':'小蓝', 'age': 10}
# print(stu_info1)
"""
深复制与浅复制与直接赋值：在Python中，可使用3种方法复制字典：直接赋值、浅复制和深复制。
（1）直接赋值：复制对象的引用。
（2）浅复制：使用copy()方法复制父对象及其子对象的引用。
（3）深复制：使用deepcopy()方法完全复制父对象及其子对象，此方法包含在copy模块中。
【例4-15】   使用直接赋值、浅复制和深复制3种方法复制中英文字典
"""

import copy  # 导入copy模块

dictionary = {
    '卷心菜': 'cabbage',
    '午餐': [
        'lunch',
        'nooning'
    ]
}
dictionary1 = dictionary  # 直接赋值
dictionary2 = dictionary.copy()  # 浅复制
dictionary3 = copy.deepcopy(dictionary)  # 深复制

# # 修改原始一层数据值
# dictionary['卷心菜'] = 'pamphrey'  #将dictionary中键为“卷心菜”的值改为“pamphrey”
# print('dictionary = ', dictionary)			    #输出dictionary
# print('dictionary1 = ', dictionary1)		 	#输出dictionary1
# print('dictionary2 = ', dictionary2)			#输出dictionary2
# print('dictionary3 = ', dictionary3)			#输出dictionary3

# 修改原始二层数据值
dictionary['午餐'].remove('nooning')  # 移除dictionary中键为“午餐”的值列表中的“nooning”
print('dictionary = ', dictionary)  # 输出dictionary
print('dictionary1 = ', dictionary1)  # 输出dictionary1
print('dictionary2 = ', dictionary2)  # 输出dictionary2
print('dictionary3 = ', dictionary3)  # 输出dictionary3
